package com.qtrue.thread3;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * @Package: com.qtrue.thread3
 * @ClassName: ThreadCreateNew02_Pool
 * @Author: xiaoBao
 * @CreateTime: 2022-05-14 15:14
 * @Description:创建线程的方式四：使用线程池
 *
 * 线程池的好处：
 *  提高响应速度（减少了创建新线程的时间）
 *  降低资源消耗（重复利用线程池中线程，不需要每次都创建）
 *  便于线程管理
 *      corePoolSize：核心池的大小
 *      maximumPoolSize：最大线程数
 *      keepAliveTime：线程没有任务时最多保持多长时间后会终止
 *      ...
 *
 * 面试题：创建多线程有几种方式？ 四种！
 *
 */
public class ThreadCreateNew02_Pool {
    public static void main(String[] args) {
        // 1. 提供指定线程数量的线程池
        ExecutorService service = Executors.newFixedThreadPool(10);

        // 设置线程池的属性（需要通过ExecutorService接口的实现类ThreadPoolExecutor来设置线程池的属性）
//        System.out.println(service.getClass()); // 通过getClass()来找到ExecutorService的实现类
        // 将当前实例化的ExecutorService类强转为实现类ThreadPoolExecutor类型，设置线程池的属性。
//        ThreadPoolExecutor service1 = (ThreadPoolExecutor) service;
//        service1.setCorePoolSize(15);
//        service1.setKeepAliveTime();

        // 2. 执行指定的线程的操作，需要提供实现Runnable接口或Callable接口实现类的对象
        // execute()：适用于实现Runnable接口创建的线程
        service.execute(new NumberThread1());
        service.execute(new NumberThread2());

        // submit()：适用于实现Callable接口创建的线程
//        service.submit();

        // 3. 关闭连接池
        service.shutdown();
    }
}

class NumberThread1 implements Runnable{

    @Override
    public void run() {
        for (int i = 0;i <= 100;i++){
            if (i % 2 == 0){
                System.out.println(Thread.currentThread().getName() + "：" + i);
            }
        }
    }

}

class NumberThread2 implements Runnable{

    @Override
    public void run() {
        for (int i = 0;i <= 100;i++){
            if (i % 2 != 0){
                System.out.println(Thread.currentThread().getName() + "：" + i);
            }
        }
    }

}